From 742c6e551af65c7d9b5b979ee8d8cb5c7e803008 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 13 May 2010 08:48:35 +0100 Subject: [PATCH] xl: Implement network-list command Signed-off-by: Eric Chanudet --- tools/libxl/libxl.c | 60 +++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.h | 15 ++++++++++ tools/libxl/xl_cmdimpl.c | 48 +++++++++++++++++++++++++++++++ tools/libxl/xl_cmdimpl.h | 1 + tools/libxl/xl_cmdtable.c | 5 ++++ 5 files changed, 129 insertions(+) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index af9c89e918..e8c9f3729e 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1505,6 +1505,66 @@ int libxl_device_nic_del(struct libxl_ctx *ctx, return libxl_device_del(ctx, &device, wait); } +libxl_nicinfo *libxl_list_nics(struct libxl_ctx *ctx, uint32_t domid, unsigned int *nb) +{ + char *dompath, *nic_path_fe; + char **l; + char *val, *tok; + unsigned int nb_nics, i; + libxl_nicinfo *res, *nics; + + dompath = libxl_xs_get_dompath(ctx, domid); + if (!dompath) { + return NULL; + } + l = libxl_xs_directory(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/device/vif", dompath), &nb_nics); + if (!l) { + return NULL; + } + res = libxl_calloc(ctx, nb_nics, sizeof (libxl_device_nic)); + if (!res) { + libxl_free(ctx, l); + return NULL; + } + nics = res; + for (*nb = nb_nics; nb_nics > 0; --nb_nics, ++l, ++nics) { + nic_path_fe = libxl_sprintf(ctx, "%s/device/vif/%s", dompath, *l); + + nics->backend = libxl_xs_read(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/backend", nic_path_fe)); + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/backend-id", nic_path_fe)); + nics->backend_id = val ? strtoul(val, NULL, 10) : -1; + + nics->devid = strtoul(*l, NULL, 10); + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/state", nic_path_fe)); + nics->state = val ? strtoul(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/mac", nic_path_fe)); + for (i = 0, tok = strtok(val, ":"); tok && (i < 6); + ++i, tok = strtok(NULL, ":")) { + nics->mac[i] = strtoul(tok, NULL, 16); + } + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/event-channel", nic_path_fe)); + nics->evtch = val ? strtol(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/tx-ring-ref", nic_path_fe)); + nics->rref_tx = val ? strtol(val, NULL, 10) : -1; + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/rx-ring-ref", nic_path_fe)); + nics->rref_rx = val ? strtol(val, NULL, 10) : -1; + nics->frontend = libxl_xs_read(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/frontend", nics->backend)); + val = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/frontend-id", nics->backend)); + nics->frontend_id = val ? strtoul(val, NULL, 10) : -1; + nics->script = libxl_xs_read(ctx, XBT_NULL, + libxl_sprintf(ctx, "%s/script", nics->backend)); + + libxl_free(ctx, nic_path_fe); + } + + libxl_free(ctx, l); + return res; +} + + /******************************************************************************/ int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_console *console) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 5d300c6aca..acf24bb954 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -373,8 +373,23 @@ int libxl_device_disk_del(struct libxl_ctx *ctx, libxl_device_disk *disk, int wa libxl_device_disk *libxl_device_disk_list(struct libxl_ctx *ctx, uint32_t domid, int *num); int libxl_cdrom_insert(struct libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); +typedef struct { + char *backend; + uint32_t backend_id; + char *frontend; + uint32_t frontend_id; + int devid; + int state; + char *script; + uint8_t mac[6]; + int evtch; + int rref_tx; + int rref_rx; +} libxl_nicinfo; + int libxl_device_nic_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); int libxl_device_nic_del(struct libxl_ctx *ctx, libxl_device_nic *nic, int wait); +libxl_nicinfo *libxl_list_nics(struct libxl_ctx *ctx, uint32_t domid, unsigned int *nb); int libxl_device_console_add(struct libxl_ctx *ctx, uint32_t domid, libxl_device_console *console); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index ed0d1979f8..24cd11c52f 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -3254,3 +3254,51 @@ int main_networkattach(int argc, char **argv) } exit(0); } + +int main_networklist(int argc, char **argv) +{ + int opt; + libxl_nicinfo *nics; + unsigned int nb; + + if (argc < 2) { + help("network-list"); + exit(1); + } + while ((opt = getopt(argc, argv, "hl")) != -1) { + switch (opt) { + case 'h': + help("network-list"); + exit(0); + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + /* Idx BE MAC Hdl Sta evch txr/rxr BE-path */ + printf("%-3s %-2s %-17s %-6s %-5s %-6s %5s/%-5s %-30s\n", + "Idx", "BE", "Mac Addr.", "handle", "state", "evt-ch", "tx-", "rx-ring-ref", "BE-path"); + for (++argv, --argc; argc > 0; --argc, ++argv) { + if (domain_qualifier_to_domid(*argv, &domid, 0) < 0) { + fprintf(stderr, "%s is an invalid domain identifier\n", *argv); + continue; + } + if (!(nics = libxl_list_nics(&ctx, domid, &nb))) { + continue; + } + for (; nb > 0; --nb, ++nics) { + /* Idx BE */ + printf("%-3d %-2d ", nics->devid, nics->backend_id); + /* MAC */ + printf("%02x:%02x:%02x:%02x:%02x:%02x ", + nics->mac[0], nics->mac[1], nics->mac[2], + nics->mac[3], nics->mac[4], nics->mac[5]); + /* Hdl Sta evch txr/rxr BE-path */ + printf("%6d %5d %6d %5d/%-11d %-30s\n", + nics->devid, nics->state, nics->evtch, + nics->rref_tx, nics->rref_rx, nics->backend); + } + } + exit(0); +} diff --git a/tools/libxl/xl_cmdimpl.h b/tools/libxl/xl_cmdimpl.h index 3c13175b98..b5a0fc54fc 100644 --- a/tools/libxl/xl_cmdimpl.h +++ b/tools/libxl/xl_cmdimpl.h @@ -43,5 +43,6 @@ int main_trigger(int argc, char **argv); int main_sysrq(int argc, char **argv); int main_top(int argc, char **argv); int main_networkattach(int argc, char **argv); +int main_networklist(int argc, char **argv); void help(char *command); diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 13e234e4fa..bf4fa8e1c7 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -194,6 +194,11 @@ struct cmd_spec cmd_table[] = { "[ip=] [script=